home *** CD-ROM | disk | FTP | other *** search
/ Amiga Games: Greatest Hits 1996 / Amiga Games: Greatest Hits 1996.iso / archive / userbox / publicdomain / frexxed.lha / frexxed / fpl / DirED.FPL < prev    next >
Text File  |  1996-03-04  |  11KB  |  477 lines

  1. // $Id: DirED.FPL 1.5 1996/03/04 09:01:14 jskov Exp $
  2. // $VER: DirED.FPL 1.0 (30.12.95) © Jesper Skov
  3.  
  4. string diredMask = "#?";
  5. int diredMark = '»';
  6. string files[1];
  7. int types[1];                                // file types (1=dir)
  8. int noOfFiles = 0;
  9.  
  10. // These columns must match the LFORMAT
  11. int colName = 9;
  12. int colNameEnd = colName+30;
  13. int colDir = 5;
  14. int colMark = 0;
  15. int colProt = 41;
  16.  
  17. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» dired() ««
  18. export void dired(string path)
  19. {
  20.   int newDiredBuf;
  21.   
  22.   if(path[strlen(path)-1]!=':' && path[strlen(path)-1]!='/')
  23.     path += "/";
  24.   
  25.   System("list \""+path+"\" dirs lformat \"%8L %-30N %8A %D\" > t:dired.d");
  26.   System("list \""+path+diredMask+"\" files lformat \"%8L %-30N %8A %D\" > t:dired.f");
  27.   System("sort t:dired.d t:dired.d. colstart "+itoa(colName+1));
  28.   System("sort t:dired.f t:dired.f. colstart "+itoa(colName+1));
  29.   
  30.   newDiredBuf = New();
  31.   SetInfo(-1,"__diredParent",CurrentBuffer(newDiredBuf));
  32.   Load("t:dired.d.");
  33.   GotoLine(-1);
  34.   InsertFile("t:dired.f.");
  35.  
  36.   System("delete QUIET FORCE t:dired.#?");
  37.   
  38.   GotoLine(0);
  39.   Output(path+diredMask+"\n");
  40.   Output("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
  41.  
  42.   if(path[strlen(path)-1]!=':'){            // add /-parent if not device
  43.     Output("     Dir /                               \n");
  44.     SetInfo(-1,"__diredDevice",0);
  45.   }
  46.  
  47.   SetInfo(-1,"autosave",0);                    // set vars and name
  48.   SetInfo(-1,"__dired",1);
  49.   SetInfo(-1,"protection","red");
  50.   SetInfo(-1,"__diredPath",path);
  51.  
  52.   GotoLine(3,colName);
  53.   Activate(0,0,ReadInfo("__diredParent"));
  54.  
  55.   diredShowMarked();
  56. }
  57.  
  58. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» Misc Routines ««
  59. int isDir()
  60. {
  61.   if(strcmp("Dir",substr(GetLine(),colDir,3)))
  62.     return 0;
  63.   else
  64.     return 1;
  65. }
  66.  
  67. string getName()
  68. {
  69.   int i=colNameEnd;
  70.   string line = GetLine();
  71.   
  72.   while(line[i]==' ')                        // find end of name
  73.     i--;
  74.  
  75.   return substr(line,colName,i-(colName-1));
  76. }
  77.  
  78. void dispOff()
  79. {
  80.   Visible(0);
  81.   SetInfo(-1,"protection","rwed");
  82.   SetInfo(-1,"insert_mode",0);
  83. }
  84.  
  85. void dispOn()
  86. {
  87.   SetInfo(-1,"insert_mode",1);
  88.   SetInfo(-1,"protection","red");
  89.   Visible(1);
  90.   RedrawScreen();
  91. }
  92.  
  93. void diredSelectedFiles()
  94. {
  95.   int line = ReadInfo("line");
  96.   int i;
  97.   
  98.   Visible(0);
  99.   
  100.   GotoLine(2);
  101.   
  102.   while(CursorDown())
  103.     if(GetChar(0)==diredMark)
  104.       i++;
  105.  
  106.   resize files[noOfFiles=i];
  107.   resize types[noOfFiles];
  108.   
  109.   GotoLine(2);
  110.   
  111.   i=0;
  112.   while(CursorDown())
  113.     if(GetChar(0)==diredMark){
  114.       files[i]=getName();
  115.       types[i++] = (GetChar(colDir)=='D') ? 1:0;
  116.     }
  117.   GotoLine(line,colName);
  118. }
  119.  
  120. void diredSelectedFilesOne()
  121. {
  122.   diredSelectedFiles();
  123.  
  124.   if(!noOfFiles){                            // do on current file
  125.     noOfFiles = 1;
  126.     resize files[1];
  127.     files[0] = getName();
  128.   }
  129. }
  130.  
  131.   //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» diredRefresh() ««
  132. export void diredRefresh()
  133. {
  134.   string path = ReadInfo("__diredPath");
  135.   int line = ReadInfo("line");
  136.   int parent = ReadInfo("__diredParent");
  137.   
  138.   Visible(0);
  139.   Clean("Kill();");
  140.   dired(path);
  141.   
  142.   SetInfo(-1,"__diredParent",parent);
  143.   GotoLine(line,colName);
  144.   if(ReadInfo("column")!=colName+1)
  145.     GotoLine(ReadInfo("lines")-1, colName);
  146.   
  147.   Visible(1);
  148.   RedrawScreen();
  149. }
  150.   
  151.  
  152. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» diredDown() ««
  153. // o Check if directory ("Dir")
  154. // o Check if /-parent -> go up
  155. // o Dive
  156. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
  157. export void diredDown()
  158. {
  159.   string line = GetLine();
  160.   
  161.   if(!isDir())
  162.     ReturnStatus("Not a directory!");
  163.   else {
  164.     string name = getName();
  165.  
  166.     if(!strcmp(name,"/"))
  167.       diredUp();
  168.     else
  169.       dired(ReadInfo("__diredPath")+name);
  170.   }
  171. }
  172.  
  173. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» diredUp() ««
  174. // Move to parent directory
  175. // o If buffer has __dired parent, no problem
  176. // o If not, check if path is device -> cannot go up
  177. // o Last, strip directory off path to go one up (slow)
  178. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
  179. export void diredUp()
  180. {
  181.   int child = CurrentBuffer(ReadInfo("__diredParent"));
  182.  
  183.   // if parent is __dired, simply go up.
  184.   if(ReadInfo("__dired")){
  185.     Activate(0,0,child);
  186.     Clean("Kill("+itoa(child)+");");
  187.   } else {
  188.     // Examine path to see if a directory can be stripped off
  189.     string path = ReadInfo("__diredPath",child);
  190.     
  191.     if(path[strlen(path)-1]==':'){            // device -> cannot go up
  192.       ReturnStatus("Cannot go up!");
  193.       CurrentBuffer(child);
  194.       return;
  195.     }
  196.  
  197.     path[strlen(path)-1]=0;                    // strip off last directory
  198.     path = Stcgfp(path);
  199.  
  200.     Visible(0);
  201.     Clean("Kill("+itoa(child)+");");
  202.     dired(path);                            // and go up (is very slow)
  203.     Visible(1);
  204.     RedrawScreen();
  205.   }
  206. }
  207.  
  208. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» diredKillAll() ««
  209. // Scan through all buffers and kill ones marked with __dired
  210. // Quite ugly, but it works :)
  211. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
  212. export void diredKillAll()
  213. {
  214.   int i, b, c;
  215.  
  216.   b = NextBuffer(-1);
  217.   i = ReadInfo("buffers");
  218.   
  219.   for(;i>0;i--){
  220.     c = NextBuffer(b);
  221.     if(ReadInfo("__dired",b))
  222.       Clean("Kill("+itoa(b)+");");
  223.     b = c;
  224.   }
  225. }
  226.  
  227.  
  228. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» diredChangeMask() ««
  229. export void diredChangeMask()
  230. {
  231.   string mask = PromptString("","Enter new mask");
  232.   if(!GetErrNo())
  233.     diredMask = mask;
  234.   diredRefresh();
  235. }
  236.  
  237.  
  238. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» diredEditFile() ««
  239. export void diredEditFile(int popupForce)
  240. {
  241.   string name = getName();
  242.   int popupOrg = ReadInfo("popup_view");
  243.   
  244.   SetInfo(-1,"popup_view", popupForce);
  245.   
  246.   Open(ReadInfo("__diredPath")+name);
  247.  
  248.   SetInfo(-1,"popup_view", popupOrg);
  249. }
  250.  
  251.  
  252. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» diredRenameFile() ««
  253. export void diredRenameFile()
  254. {
  255.   string path = ReadInfo("__diredPath");
  256.   string oldName = getName();
  257.   string newName = PromptString(oldName,"Enter new name");
  258.   
  259.   if(strlen(newName))
  260.     if(System("rename FROM \""+path+oldName+"\" TO \""+path+newName+"\" QUIET")){
  261.       ReturnStatus("Renaming failed!");
  262.       return;
  263.     } else
  264.       diredRefresh();
  265. }
  266.  
  267. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» diredMarkFile() ««
  268. export void diredMarkFile(int move)
  269. {
  270.   // first check if below the static stuff
  271.   if(ReadInfo("line")>(ReadInfo("__diredDevice") ? 2 : 3)){
  272.   
  273.     int mark = diredMark;
  274.     string line = GetLine();
  275.   
  276.     if(line[colMark]==mark)
  277.       mark = ' ';
  278.  
  279.     dispOff();
  280.     GotoLine(ReadInfo("line"));
  281.     Output(itoc(mark));
  282.  
  283.     if(move)
  284.       CursorDown();
  285.     
  286.     diredShowMarked();
  287. //    dispOn();
  288.     
  289.   }
  290. }
  291.  
  292. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» diredShowMarked() ««
  293. void diredShowMarked()
  294. {
  295.   int d, f, md, mf;
  296.   int line = ReadInfo("line");
  297.   
  298.   dispOff();
  299.   
  300.   if(ReadInfo("__diredDevice"))
  301.     GotoLine(2);
  302.   else
  303.     GotoLine(3);
  304.   
  305.   while(CursorDown()){
  306.     if(GetChar(colDir)=='D'){
  307.       d++;
  308.       if(GetChar(colMark)==diredMark)
  309.         md++;
  310.     } else {
  311.       f++;
  312.       if(GetChar(colMark)==diredMark)
  313.         mf++;
  314.     }
  315.   }
  316.   f--;                                        // above loop is 1 off!
  317.   
  318.   Rename(sprintf("*Dired* Dirs=(%.3d|%.3d) Files=(%.3d|%.3d)",d,md,f,mf));
  319.   GotoLine(line,colName);
  320.   
  321.   dispOn();
  322. }
  323.     
  324. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» diredNewPath() ««
  325. export void diredNewPath()
  326. {
  327.   string newPath = PromptString("","New path");
  328.   
  329.   if(!GetErrNo()){
  330.     if(!Check(newPath))
  331.       ReturnStatus("Illegal path!");
  332.     else {
  333.       Visible(0);
  334.       diredKillAll();
  335.       dired(newPath);
  336.       Visible(1);
  337.       RedrawScreen();
  338.     }
  339.   }
  340. }    
  341.  
  342. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» diredShowDir() ««
  343. export void diredShowDir()
  344. {
  345.   ReturnStatus(ReadInfo("__diredPath"));
  346. }
  347.  
  348. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» diredProtectFile() ««
  349. export void diredProtectFile()
  350. {
  351.   string protection = substr(GetLine(),colProt,7);
  352.   int script = (protection[0]!='-');
  353.   int pure = (protection[1]!='-');
  354.   int archive = (protection[2]!='-');
  355.   int read = (protection[3]!='-');
  356.   int write = (protection[4]!='-');
  357.   int execute = (protection[5]!='-');
  358.   int delete = (protection[6]!='-');
  359.  
  360.   if(RequestWindow("DirED file protection",20,
  361.                  "script","b", &script,
  362.                  "pure","b", &pure,
  363.                  "archive","b", &archive,
  364.                  "read","b", &read,
  365.                  "write","b", &write,
  366.                  "execute","b", &execute,
  367.                  "delete","b", &delete)){
  368.                    
  369.     protection = "";
  370.     protection += (script) ? "s" : "";
  371.     protection += (pure) ? "p" : "";
  372.     protection += (archive) ? "a" : "";
  373.     protection += (read) ? "r" : "";
  374.     protection += (write) ? "w" : "";
  375.     protection += (execute) ? "e" : "";
  376.     protection += (delete) ? "d" : "";
  377.                    
  378.     System("protect \""+ReadInfo("__diredPath")+getName()+"\" "+protection);
  379.     diredRefresh();
  380.   }
  381. }
  382.  
  383. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» diredDeleteFile() ««
  384. export void diredDeleteFile()
  385. {
  386.   int line = ReadInfo("line");
  387.   int i,  w, current=0, force=0;
  388.   string key;
  389.   
  390.   diredSelectedFilesOne();
  391.  
  392.   for(i=0;i<noOfFiles;i++){
  393.     if(!force){
  394.       Status(0,"Delete "+files[i]+"? (Yes/No/All)");
  395.       current = w = 0;
  396.       while(!w){
  397.         key = GetKey();
  398.         switch(key[0]){
  399.         case 0x1b:
  400.           diredRefresh();
  401.           return;
  402.         case 0x07:
  403.           diredRefresh();
  404.           return;
  405.         case 'a':
  406.           force = current = w = 1;
  407.           break;
  408.         case 'y':
  409.           current = w = 1;
  410.           break;
  411.         case 'n':
  412.           w = 1;
  413.           break;
  414.         }
  415.       }
  416.     }
  417.     
  418.     if(current)
  419.       System("Delete \""+ReadInfo("__diredPath")+files[i]+"\" ALL QUIET");
  420.   }
  421.   diredRefresh();
  422. }
  423.  
  424.  
  425. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» diredCopyFile() ««
  426. export void diredCopyFile()
  427. {
  428.   string dest = PromptFile("", "Select destination", "", "ds");
  429.   
  430.   if(strlen(dest)){
  431.     int i;
  432.     
  433.     diredSelectedFilesOne();
  434.  
  435.     for(i=0;i<noOfFiles;i++){
  436.       Status(0,"Copying "+files[i]+"...");
  437.       System("Copy \""+ReadInfo("__diredPath")+files[i]+"\" TO \""+dest+"\" ALL NOREQ QUIET");
  438.     }  
  439.   }
  440. }
  441.   
  442. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» Key bindings ««
  443. AssignKey("diredDown();","'return'","__dired");
  444. AssignKey("diredUp();","'backspace'","__dired");
  445. AssignKey("diredKillAll();","q","__dired");
  446. AssignKey("diredKillAll();","'escape'","__dired");
  447.  
  448. AssignKey("diredChangeMask();","m","__dired");
  449. AssignKey("diredRefresh();","l","__dired");
  450. AssignKey("diredNewPath();","j","__dired");
  451.  
  452. AssignKey("diredEditFile(0);","e","__dired");
  453. AssignKey("diredEditFile(1);","E","__dired");
  454.  
  455. AssignKey("diredRenameFile();","r","__dired");
  456. AssignKey("diredProtectFile();","p","__dired");
  457. AssignKey("diredDeleteFile();","d","__dired");
  458. AssignKey("diredCopyFile();","c","__dired");
  459.  
  460. AssignKey("diredShowDir();","?","__dired");
  461.  
  462. AssignKey("diredMarkFile(1);","'space'","__dired");
  463. AssignKey("diredMarkFile(0);","shift 'space'","__dired");
  464.  
  465.  
  466. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» Info vars ««
  467. ConstructInfo("__dired","","","HLB","",0,1,0);
  468. ConstructInfo("__diredDevice","","","HLB","",0,1,1);
  469. ConstructInfo("__diredPath","","","HLS","",0,0);
  470. ConstructInfo("__diredParent","","","HLI","",0,0x7fffffff,0);
  471.  
  472.  
  473. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» DirED Menu ««
  474. MenuAdd("i", "DirED", "string path = PromptFile(\"\",\"DirED path\",\"\",\"d\");if(strlen(path)) dired(path);","",1,15);
  475. MenuAdd("i", "---","","",1,15);
  476. MenuBuild();
  477.